package com.imooc.modular.aspect;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Date;


/**
 * 时间切面
 * 对比 Filter  Interceptor Aspect
 * 拦截方向：Filter --》 Interceptor ---》 aspect  ---》controller
 *
 * filter：是javaWeb 的过滤器拦截不到spring 相关的内容 如哪个Controller哪个方法，在spring boot 中有两种配置方式
 *          1. 声明为@Component
 *          2. 编写config类继承WebMvcConfigurationSupport 重写addInterceptors方法
 *
 * Interceptor：spring框架自己带的拦截器，可以拿到你请求的控制器和方法，却拿不到请求方法的参数。它会处理自己写的拦截器，也会拦截的拦截BasicErrorController
 *
 * Aspect ： 可以拿到方法的参数，但是却拿不到http请求和响应的对象
 *
 *
 * @author yuelinbo
 * @date 2019/2/11 14:01
 **/
@Aspect
@Component
public class TimeAspect {


    @Around("execution(* com.imooc.modular.controller.UserController.*(..))")
    public Object handlerControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        ThreadLocal<Long> threadLocal = new ThreadLocal<>();
        System.out.println("time Aspect start");

        long start = new Date().getTime();
        threadLocal.set(start);

        //获取参数
        Object proceed = proceedingJoinPoint.proceed();
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object o : args) {
            System.out.println("参数arg:" + o.toString());
        }

        System.out.println("time Aspect end" + (new Date().getTime() - threadLocal.get()));

        return proceed;


    }
}
